home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
book
/
src
/
mouse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-08
|
4KB
|
178 lines
/*
*
* マウス・パッド関連の下位ルーチン群
*
*/
#include <stdio.h>
#include <egb.h>
#include <mos.h>
#include "book.h"
#include "mouse.h"
#include "moscsr.def"
/*
* モノクロパターンとして保持しているマウスカーソルパターンを
* 16色に変換し、カラーマウスカーソルとして使えるようにする
*/
void mos_ptn_init( void )
{
int pos, apos ;
int i, j, k, l ;
MOS *mp ;
for( l = 0 ; l < 4 ; l ++ )
{
mp = &mosptn[l] ;
pos = 0 ;
apos = mp->ysiz * mp->xsiz * 4 ;
for( i = 0 ; i < mp->ysiz ; i ++ )
{
for( j = 0 ; j < mp->xsiz ; j ++ )
{
mp->ptn[apos] = 0 ;
for( k = 0 ; k < 4 ; k ++ )
{
mp->ptn[apos] |=
( ( (mp->ptn[pos+k] & 0xF0) == 0 ? 1:0 ) |
( (mp->ptn[pos+k] & 0x0F) == 0 ? 2:0 ) )
<< ( (3-k)*2 ) ;
}
apos ++ ;
pos += 4 ;
}
}
}
}
/*
* マウスカーソルのパターンを切り換える
* ただし、同じパターンに切り換え動作をするとカーソルがちらつくので、
* その場合は処理をはしょる
*/
static int mos_csr_ptn = -1 ; /* マウス・カーソルの番号 */
int get_mos_ptn( void ) /* 現在のカーソルパータンを返す */
{
return mos_csr_ptn ;
}
void set_mos_ptn( int num ) /* 強制的にパターンを切り換える */
{
MOS *mp = &mosptn[ num ] ;
MOS_type( 2, mp->x, mp->y, &mp->xsiz ) ;
mos_csr_ptn = num ;
}
void mos_ptn( int num ) /* マウス・カーソルの切り換え */
{
if( get_mos_ptn() != num )
set_mos_ptn( num ) ;
}
/*
* 現在のマウスカーソル位置を退避/復元する
*
* backup == TRUE ならば退避、FALSEならば復元
*/
void mos_backup( int backup )
{
static int sw, x, y ;
if( backup )
MOS_rdpos( &sw, &x, &y ) ;
else
MOS_setpos( x, y ) ;
}
/*
* MOS_disp() 制御を無効にする
*/
void mos_dispoff( int flag )
{
static short control[16] ;
static short num = 0 ;
if( flag ) /* MOS_disp() を無効にする */
{
control[num] = MOS_getControl() ;
MOS_setControl( control[num] & 0xFFFE ) ;
if( ++num > 15 ) num = 15 ;
}
else /* MOS_disp() を復帰する */
{
if( --num < 0 ) num = 0 ;
MOS_setControl( control[num] ) ;
}
}
/* マウスとパッドを区別せず扱う位置情報取得ルーチン */
#if JOYPAD==USE_JOYPAD
# define padU(x) ( ((x) & 0x01) == 0 ? TRUE : FALSE )
# define padD(x) ( ((x) & 0x02) == 0 ? TRUE : FALSE )
# define padL(x) ( ((x) & 0x04) == 0 ? TRUE : FALSE )
# define padR(x) ( ((x) & 0x08) == 0 ? TRUE : FALSE )
# define padA(x) ( ((x) & 0x10) == 0 ? TRUE : FALSE )
# define padB(x) ( ((x) & 0x20) == 0 ? TRUE : FALSE )
#endif
void mos_rdpos( int *p_sw, int *p_x, int *p_y )
{
#if JOYPAD==USE_JOYPAD
static int pad_num = 0 ;
static int count = 0 ;
auto int pad, dt, dx, dy ;
#endif
auto int sw, x, y ;
/* マウスカーソルの位置を読み込む */
MOS_rdpos( &sw, &x, &y ) ;
#if JOYPAD==USE_JOYPAD
/* パッドによる制御 */
SND_joy_in_1( 0, &pad ) ;
if( 0x3F != pad ) /* どれかON */
{
sw = ( padB( pad ) ? 2 : 0 ) | ( padA( pad ) ? 1 : 0 ) ;
if( count ++ >= 10 )
{
count = 0 ;
if( ( dt = pad_num / 20 ) < 1 ) dt = 1 ;
if( dt > 10 ) dt = 10 ;
dx = dy = 0 ;
if( !padL( pad ) || !padR( pad ) )
dx = ( padL( pad ) ? (- dt) : ( padR( pad ) ? dt : 0 ) ) ;
if( !padU( pad ) || !padD( pad ) )
dy = ( padU( pad ) ? (- dt) : ( padD( pad ) ? dt : 0 ) ) ;
if( dx != 0 || dy != 0 )
MOS_setpos( x += dx, y += dy ) ;
pad_num ++ ;
}
}
else
pad_num = 0 ;
#endif
if( p_sw != NULL ) *p_sw = sw ;
if( p_x != NULL ) *p_x = x ;
if( p_x != NULL ) *p_y = y ;
}